#include <stdio.h>
#include <stdlib.h>  //堆的头文件

int main()
{
    // //申请堆上空间可能会失败：1、空间不够，返回空指针
    
    // int *p = (int*)malloc(4);  //完成在堆上空间的申请
    // if(p == NULL)
    // {
    //     printf("malloc  申请空间失败!\n");
    //     return -1;
    // }
    // *p = 20;
    // printf("%d\n",*p);
    // free(p);  //释放堆上空间
    // return 0;



    //申请一维数组
    // int *p = (int*)malloc(sizeof(int) * 10);
    // if(p = NULL)
    // {
    //     printf("malloc   空间申请失败!\n");
    //     return -1;
    // }
    // for(int i = 0; i < 10; i++)
    // {
    //     p[i] = i+1;
    // }
    // for(int i = 0; i < 10; i++)
    // {
    //     printf("%d ",p[i]);
    // }
    // printf("\n");
    // free(p);
    // return 0;



    //申请二维数组
    int** p = (int**)malloc(sizeof(int*) * 2); //申请二级指针
    if(p == NULL)
    {
        printf("malloc   空间申请失败!\n");
        return -1;
    }
    for(int i = 0; i < 2; i++)
    {
        p[i] = (int*)malloc(sizeof(int) * 3);
        if(p[i] == NULL)
        {
            printf("malloc   空间申请失败!\n");
            return -1;
        }
    }

    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            p[i][j] = i * 3 + j +1;
        }
    }

    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ",p[i][j]);
        }
        printf("\n");
    }

    for(int i = 0; i < 2; i++)
    {
        free(p[i]);
    }
    free(p);
    return 0;
}